/*
 * @Author: qinuoyun
 * @Date:   2021-02-03 11:10:40
 * @Last Modified by:   qinuoyun
 * @Last Modified time: 2021-02-03 11:19:09
 */
import axios from 'axios'

// 数据存储
export const cache = {
    data: {},
    set(key, data) {
        this.data[key] = data
    },
    get(key) {
        return this.data[key]
    },
    clear(key) {
        delete this.data[key]
    }
}

// 建立唯一的key值
export const buildUniqueUrl = (url, method, params = {}, data = {}) => {
    const paramStr = (obj) => {
        if (toString.call(obj) === '[object Object]') {
            return JSON.stringify(Object.keys(obj).sort().reduce((result, key) => {
                result[key] = obj[key]
                return result
            }, {}))
        } else {
            return JSON.stringify(obj)
        }
    }
    url += `?${paramStr(params)}&${paramStr(data)}&${method}`
    return url
}

// 防止重复请求
export default (options = {}) => async config => {
    const defaultOptions = {
        time: 0, // 设置为0，不清除缓存
        ...options
    }
    const index = buildUniqueUrl(config.url, config.method, config.params, config.data)
    let responsePromise = cache.get(index)
    if (!responsePromise) {
        responsePromise = (async () => {
            try {
                const response = await axios.defaults.adapter(config)
                return Promise.resolve(response)
            } catch (reason) {
                cache.clear(index)
                return Promise.reject(reason)
            }
        })()
        cache.set(index, responsePromise)
        if (defaultOptions.time !== 0) {
            setTimeout(() => {
                cache.clear(index)
            }, defaultOptions.time)
        }
    }
    return responsePromise.then(data => JSON.parse(JSON.stringify(data))) // 为防止数据源污染
}